#include "motor_foc_manager.h"
#include "stm32f1xx_hal.h"
#include <stdint.h>

// 全局FOC管理器实例
Motor_FOC_Manager g_foc_manager;
uint8_t g_foc_recv_data[FOC_CMD_BUFFER_SIZE] = {0};
uint16_t g_foc_recv_data_len = 0;

void FOC_Manager_Hall_portCfg_Init(Motor_FOC_Manager* manager) {
    // 配置霍尔传感器引脚
    // 初始化霍尔传感器配置
    manager->hall_config.hall_a_port = GPIOA;
    manager->hall_config.hall_a_pin = GPIO_PIN_0;
    manager->hall_config.hall_b_port = GPIOA;
    manager->hall_config.hall_b_pin = GPIO_PIN_1;
    manager->hall_config.hall_c_port = GPIOA;
    manager->hall_config.hall_c_pin = GPIO_PIN_2;
 }

void FOC_Manager_Init(Motor_FOC_Manager* manager) {
    if (manager == NULL) {
        return;
    }
    
    // 初始化FOC控制器
    FOC_Init(&manager->foc);
    
    FOC_Manager_Hall_portCfg_Init(manager);
    
    // 初始化霍尔传感器处理模块
    HALL_Init(&manager->hall_handler, &manager->hall_config);
    
    // 标记为已初始化
    manager->is_initialized = 1;
    
    // 记录初始化日志
    FOC_LogEvent(FOC_LOG_EVENT_INIT, 0);
}


void FOC_Manager_SetTarget(Motor_FOC_Manager* manager, MotorModeType_e mode, int16_t target) {
    if (manager == NULL || !manager->is_initialized) {
        return;
    }
    
    manager->foc.inputs.z_ctrlModReq = mode;
    manager->foc.inputs.r_inpTgt = target;
    
    // 记录模式变化日志
    FOC_LogEvent(FOC_LOG_EVENT_MODE_CHANGE, mode);
}

void FOC_Manager_Enable(Motor_FOC_Manager* manager, uint8_t enable) {
    if (manager == NULL || !manager->is_initialized) {
        return;
    }
    
    manager->foc.inputs.b_motEna = enable ? 1 : 0;
    
    if (enable) {
        FOC_LogEvent(FOC_LOG_EVENT_START, 0);
    } else {
        FOC_LogEvent(FOC_LOG_EVENT_STOP, 0);
    }
}

uint8_t FOC_Manager_IsReady(Motor_FOC_Manager* manager) {
    if (manager == NULL || !manager->is_initialized) {
        return 0;
    }
    
    // 检查FOC是否已成功启动
    return (manager->foc.softStartStatus == SOFT_START_SUCCESS) ? 1 : 0;
}

void FOC_Manager_GetOutputs(Motor_FOC_Manager* manager, FOCOutputs* outputs) {
    if (manager == NULL || outputs == NULL || !manager->is_initialized) {
        return;
    }
    
    *outputs = manager->foc.outputs;
}

// 获取全局FOC管理器实例
Motor_FOC_Manager* Get_Global_FOC_Manager(void) {
    return &g_foc_manager;
}

// 在 motor_foc_manager.c 中添加以下函数
void FOC_Manager_SaveConfig(Motor_FOC_Manager* manager) {
    if (manager == NULL || !manager->is_initialized) {
        return;
    }
    FOC_SaveConfig(&manager->foc);
}

void FOC_Manager_LoadConfig(Motor_FOC_Manager* manager) {
    if (manager == NULL) {
        return;
    }
    FOC_LoadConfig(&manager->foc);
    
    // 标记为已初始化
    manager->is_initialized = 1;
    
    // 记录初始化日志
    FOC_LogEvent(FOC_LOG_EVENT_INIT, 0);
}

void FOC_Manager_TransmitData(Motor_FOC_Manager* manager) {
    if (manager == NULL || !manager->is_initialized) {
        return;
    }
    FOC_Data_Transmit(&manager->foc);
}

void FOC_Manager_ReceiveData(Motor_FOC_Manager* manager) {
    if (manager == NULL || !manager->is_initialized) {
        return;
    }
    FOC_Data_Parse(&manager->foc, g_foc_recv_data,g_foc_recv_data_len);
}

// 更新 FOC_Manager_Update 函数，添加通信处理
void FOC_Manager_Update(Motor_FOC_Manager* manager) {
    if (manager == NULL || !manager->is_initialized) {
        return;
    }
    
    // 接收控制命令
    FOC_Manager_ReceiveData(manager);
    
    // 更新ADC数据
    motor_adc_update_all_channels_dma();
    
    // 更新FOC输入数据
    FOC_UpdateInputsFromADC(&manager->foc);
    
    // 更新霍尔传感器数据
    HALL_Update(&manager->hall_handler);
    HALL_UpdateFOCInputs(&manager->hall_handler, &manager->foc);
    
    // 获取电池电压和温度
    int16_t bat_voltage = (int16_t)motor_adc_get_converted_value(MOTOR_ADC_CHANNEL_DC);
    int16_t temperature = (int16_t)motor_adc_get_converted_value(MOTOR_ADC_CHANNEL_TEMP_DRV);
    
    // 执行FOC主循环
    FOC_Step(&manager->foc, bat_voltage, temperature);
    
    // 发送状态数据
    FOC_Manager_TransmitData(manager);
    
    // 记录速度变化日志（如果速度变化较大）
    static int16_t last_speed = 0;
    if (abs(manager->foc.outputs.n_mot - last_speed) > 100) {
        FOC_LogEvent(FOC_LOG_EVENT_SPEED_CHANGE, manager->foc.outputs.n_mot);
        last_speed = manager->foc.outputs.n_mot;
    }
}